<?php

/**
 * AdminController
 *
 * @author luubk
 * @since Dec 22, 2012 - 3:24:36 PM
 */
class BackController extends CController
{

    /**
     * @var array the breadcrumbs of the current page. The value of this property will
     * be assigned to {@link CBreadcrumbs::links}. Please refer to {@link CBreadcrumbs::links}
     * for more details on how to specify this property.
     */
    public $breadcrumbs = array();
    public $layout = '//layouts/column';
    public $lang = '';
    public $lang_id = '';
    // Menu hiển thị nội bộ trong Controller
    public $controllerMenu = array();
    // Menu chính bên tay trái
    public $sidebarMenu = array();
    public $setingMenu = array();
    // Model User
    public $user = NULL;
    // Model được xử lý chính xử lý trong Controller này
    public $modelName = '';
    public $model = '';
    public $asset = '';
    // Dat cac file view
    public $indexView = 'index';
    public $formView = 'form';
    public $typeMyActiveForm = false;

    function init()
    {
        Yii::app()->theme = 'quanly';
        /*
         * Xử lý ngôn ngữ
         */
        $this->setLanguage();

        Yii::app()->params['adminHomeUrl'] = $this->createUrl('default/', array(
            'lang' => Yii::app()->language
        ));

        $this->sidebarMenu = array();

        if (Admin::checkAccess('index', 'Post'))
            $this->sidebarMenu[] = array(
                'label' => 'Bài viết',
                'url' => $this->createUrl('post/index', array('lang' => $this->lang)),
                'icon' => 'edit',
            );
        if (Admin::checkAccess('index', 'Customer'))
            $this->sidebarMenu[] = array(
                'label' => Yii::t('customer', 'Customer'),
                'url' => $this->createUrl('customer/', array('lang' => $this->lang)),
                'icon' => 'user',
            );
        if (Admin::checkAccess('index', 'Order'))
            $this->sidebarMenu[] = array(
                'label' => Yii::t('order', 'Order'),
                'url' => $this->createUrl('order/', array('lang' => $this->lang)),
                'icon' => 'shopping-cart',
            );
        if (Admin::checkAccess('index', 'Adminuser'))
            $this->sidebarMenu[] = array(
                'label' => Yii::t('adminuser', 'Admin'),
                'url' => $this->createUrl('adminuser/', array('lang' => $this->lang)),
                'icon' => 'user-md',
            );

        if (Admin::checkAccess('index', 'option'))
            $this->sidebarMenu[] = array(
                'label' => Yii::t('quanly', 'Setting'),
                'url' => $this->createUrl('option/', array('lang' => $this->lang)),
                'icon' => 'cogs',
            );


        // Đặt Menu cho mỗi Controller
        $this->setControllerMenu();

        // Gọi model admin
        if (Yii::app()->user->isGuest == FALSE)
            $this->user = Admin::model()->findByPk(Yii::app()->user->id);

        // Tạo model được sử dụng chính trong Controller này
        $pk = isset($_GET['pk']) ? $_GET['pk'] : FALSE;

        $model = $this->modelName;

        if ($model && class_exists($model))
        {
            if ($pk)
            {
                $this->model = call_user_func($model . '::model');
                $this->model = $this->model->findByPk($pk);
                if ($this->model == NULL)
                    throw new CHttpException(400, Yii::t('yii', 'Your request is invalid.'));
            }
            else
                $this->model = new $model;
        }

        $assetPath = $_SERVER['DOCUMENT_ROOT']
                . DIRECTORY_SEPARATOR . Yii::app()->theme->baseUrl
                . DIRECTORY_SEPARATOR . 'asset';
        $this->asset = Yii::app()->getAssetManager()->publish($assetPath);
//        Yii::app()->name = Option::getItem('site_name');
//        die('asds');
    }

    /**
     * Xử lý ngôn ngữ cho website
     * 
     * Tìm ngôn ngữ có trong csdl so khớp với yêu cầu ngôn ngữ từ URL
     * và trả về ngôn ngữ phù hợp cho website hiển thị, 
     * nếu ngôn ngữ yêu cầu không tồn tại => trả về mặc định
     */
    protected function setLanguage()
    {
        $lang_code = isset($_GET['lang']) ? $_GET['lang'] : '';

        $lang = Language::model()->findByAttributes(
                array("status" => 1, "code" => $lang_code,));

        if ($lang == null)
        {
            $default = Language::model()->findByAttributes(
                    array("status" => 1, "default" => 1,));

            if ($default !== null)
                $this->redirect($this->createUrl("default/index", array('lang' => $default->code)));
            else
                $this->redirect($this->createUrl('default/index', array('lang' => 'vi')));
        }

        Yii::app()->language = $this->lang = $lang->code;
        Yii::app()->params['lang_id'] = $this->lang_id = $lang->id;
    }

    /**
     * Xử lý Menu cho Controller
     * Dựa vào các Action trong mỗi Controller đó
     */
    protected function setControllerMenu()
    {
        // Lấy các phương thức của Controller hiện tại
        $controller = Yii::app()->controller->id;

        $methods = get_class_methods(ucfirst($controller) . "Controller");

        foreach ($methods as $method)
        {
            // Bỏ qua các phương thức không thuộc dạng: "actionIndex"
            if (!(strpos($method, 'action') === 0))
                continue;
            // Bỏ qua các phương thức "actions"
            if ((strpos($method, 'actions') === 0))
                continue;

            // Cắt lấy phần tên của action
            $action = str_replace("action", "", $method);

            // Không hiển thị một số action 
            $blackList = array('Update', 'Delete', 'View');
            if (in_array($action, $blackList))
                continue;

            if (!Admin::checkAccess($action, $controller))
                continue;

            // Đưa vào menu của Controller
            $this->controllerMenu[] = array(
                'label' => Yii::t($controller, $action),
                'url' => $this->createUrl("$controller/" . strtolower($action), array(
                    'lang' => $this->lang
                ))
            );
        }
    }

    /**
     * @return array action filters
     */
    public function filters()
    {
        return array(
            'accessControl', // perform access control for CRUD operations
        );
    }

    /**
     * Specifies the access control rules.
     * This method is used by the 'accessControl' filter.
     * @return array access control rules
     */
    public function accessRules()
    {
        return array(
            array('allow', // allow all users to access 'index' and 'view' actions.
                'controllers' => array('default'),
                'actions' => array('login', 'error', 'forgotPassword'),
                'users' => array('*'),
            ),
            array('allow', // allow authenticated users to access all actions
                'users' => array('@'),
            ),
            array('deny', // deny all users
                'users' => array('*'),
            ),
        );
    }

    public function actionIndex()
    {
        $this->checkAccess();

        // Lấy các phương thức của Controller hiện tại
        $controller = Yii::app()->controller->id;
        $this->pageTitle = Yii::t($controller, ucfirst($controller));

        $this->render($this->indexView);
    }

    public function actionSearch()
    {
        $this->checkAccess();
        $this->pageTitle = Yii::t('main', 'Search');
        $this->actionIndex();
    }

    public function actionView($pk)
    {
        $this->checkAccess();

        $this->pageTitle = Yii::t('main', 'View');
        echo $pk;
    }

    public function actionCreate()
    {
        $this->checkAccess();

        $controller = Yii::app()->controller->id;
        $this->pageTitle = Yii::t($controller, ucfirst($controller));
        $this->pageTitle .= " / " . Yii::t($controller, 'Create');

        $this->model->setScenario('create');
        $this->form('Create');
    }

    public function actionUpdate()
    {
        $controller = Yii::app()->controller->id;
        $this->pageTitle = Yii::t($controller, ucfirst($controller));
        $this->pageTitle .= " / " . Yii::t($controller, 'Update');

        $this->checkAccess();

        $this->model->setScenario('update');
        $this->form('Update');
    }

    protected function form($action = 'Create')
    {
        // if it is ajax validation request
        if (isset($_POST['ajax']))
        {
            echo CActiveForm::validate($this->model);
            Yii::app()->end();
        }

        // collect user input data
        if (isset($_POST[$this->modelName]))
        {
            $this->model->attributes = $_POST[$this->modelName];
            // validate user input and redirect to the previous page if valid
            if ($this->model->validate())
            {
                // Thông báo nếu cập nhật bị lỗi
                $noti = Yii::t('form', 'Can\'t do {action} , please try again!', array(
                            '{action}' => Yii::t('form', $action)
                ));

                $saveStatus = $this->save($action);
                // Thông báo nếu cập nhật thành công
                if ($saveStatus)
                    $noti = Yii::t('form', '{action} successful!', array(
                                '{action}' => Yii::t('form', $action)
                    ));

                Yii::app()->user->setFlash('noti', $noti);
                if ($saveStatus)
                {
                    $submit = isset($_POST['submit']) ? $_POST['submit'] : 'return';

                    if ($submit == 'return')
                    {
                        $getParams = $_GET;
                        // Nếu trường hợp update thì khi ra ngoài list sẽ bỏ pk đi
                        if (isset($getParams['pk']))
                            unset($getParams['pk']);
                        $this->redirect($this->createUrl(Yii::app()->controller->id . "/index", $getParams));
                    }
                    elseif ($submit == 'continue')
                        $this->refresh();
                }
            }
        }
        $this->render($this->formView);
    }

    protected function save($action = 'Create')
    {
        return $this->model->save();
    }

    public function actionDelete()
    {
        $this->checkAccess();

        // Thông báo nếu cập nhật bị lỗi
        $noti = Yii::t('form', 'Can\'t delete this item, please try again!');

        // Thông báo nếu cập nhật thành công
        if ($this->model->delete())
            $noti = Yii::t('form', 'Delete is successfuly!');

        Yii::app()->user->setFlash('noti', $noti);
        $route = Yii::app()->controller->id . "/index";
        $url = Yii::app()->controller->createUrl($route, array(
            'lang' => Yii::app()->language,
        ));
        $this->redirect($url);
    }

    /**
     * Kiềm tra quyền truy cập
     * @param string $action Tên của hành động cần thực hiện
     * @return boolean
     * @throws CHttpException
     */
    protected function checkAccess($action = '', $controller = '')
    {
        // Lấy tên controller và tên action
        $con = $controller != '' ? ucfirst($controller) : ucfirst(Yii::app()->controller->id);
        $act = $action != '' ? ucfirst($action) : ucfirst(Yii::app()->controller->action->id);

        if (Admin::checkAccess($act, $con))
            return TRUE;
        else
            throw new CHttpException(400, Yii::t('yii', 'You are not authorized to perform this action.'));
    }

}

/** 
 * End file AdminController
 */
